/**
 * Grunt的入口文件
 * 用于定义一些需要 Grunt 自动执行的任务
 * 需要导出一个函数
 * 此函数接收一个 grunt 的形参，内部提供一些创建任务时可以用到的 API
 */

module.exports = grunt => {
  grunt.registerTask('foo',()=>{//注册一个任务 任务发生自动执行函数 yarn grunt foo
    console.log('hello grunt');
  })

  grunt.registerTask('bar','任务描述',()=>{ //‘任务描述’会出现在yarn grunt --help帮助信息中 
    console.log('other task~');
  })

  // grunt.registerTask('default',()=>{
  //   console.log('default task~'); //默认任务 执行时可以不添加名称
  // })

  // grunt.registerTask('default',['foo','bar']) //依次执行数组中的任务

  grunt.registerTask('async-task',function(){
    const done = this.async()//得到一个回调函数，异步操作结束调用它，标识任务已经完成
    setTimeout(()=>{
      console.log("async task working");
      done()
    },1000)
  })

  //-------------------------------------------------------------------------------------------

  grunt.registerTask('bad',()=>{  //yarn grunt bad
    console.log('bad working~');
    return false  //标记任务失败,如果在任务列表中，它的失败会阻止后续任务运行
  })

  grunt.registerTask('good1',()=>{
    console.log('good1 working~');
  })
  
  grunt.registerTask('good2',()=>{
    console.log('good2 working~');
  })

  grunt.registerTask('default',['good1','bad','good2']) //good2内容不再输出


  grunt.registerTask('bad-async',function(){
    const done = this.async()
    setTimeout(()=>{
      console.log("async task working");
      done(false) //异步任务标记失败
    },1000)
  })

//-------------------------------------------------------------------------------------------

  grunt.initConfig({ //接收一个对象，键与任务名称抱持一致，值任意类型数据
    baz:'我是value'
  })

  grunt.registerTask('baz',()=>{
    console.log(grunt.config('baz')) //获取配置，接收字符串参数，配置的名字
  })

  
  grunt.initConfig({ 
    baz1:{
      bar:'我是value'
    }
  })

  grunt.registerTask('baz1',()=>{
    console.log(grunt.config('baz1.bar')) //如果是对象可以这样，当然也可以grunt.config('baz1').bar
  })

//-------------------------------------------------------------------------------------------
  grunt.initConfig({
    'build':{
      options:{ //除了options都是任务目标，它会作为任务的配置选项出现，yarn grunt build并不会执行
        mcgee:"大家都是你好你好"
      }, 
      css:"1",//目标名称
      js:"2",
      ts:{ //目标中也可以添加目标的配置选项
        options:{
          mcgee:"我独有的，会覆盖对象中的options"
        }
      }
    }
  })

  //多目标模式，可以让任务根据配置形成多个子任务,需要通过initConfig配置不同目标
  grunt.registerMultiTask('build',function(){   //yarn grunt build || yarn grunt build:css运行指定的目标
    console.log(`target:${this.target},data:${this.data}`); //也就是配置目标名和值 target:css,data:1
    console.log(this.options()); //拿到对应配置选项 { mcgee: '你好你好' }
  })

  //---------------------------------------------------------------------------------------

}